package com.lzlg.lzlglab.service.impl;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lzlg.lzlglab.entity.SmartLabs;
import com.lzlg.lzlglab.entity.SmartLabsExample;
import com.lzlg.lzlglab.mapper.SmartLabsMapper;
import com.lzlg.lzlglab.mapper.ex.SmartLabsExMapper;
import com.lzlg.lzlglab.service.SmartLabsService;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

/*
    1、注册Bean
    2、实现接口
 */
@Service
public class SmartLabsImpl implements SmartLabsService {

    // 方法调用顺序
    // Controller -> Service -> Dao（mapper）
    // 维护mapper的对象
    @Autowired
    SmartLabsMapper smartLabsMapper;
    @Autowired
    SmartLabsExMapper smartLabsExMapper;

    @Override
    public List<SmartLabs> findAllSmartLabs() {
        // 通过example快速实现
        return smartLabsMapper.selectByExample(new SmartLabsExample());
    }

    @Override
    public void saveOrUpdateLabs(SmartLabs smartLabs) {
        // 根据smartLabs中是否存在id
        // 获得id
        String id = smartLabs.getId();
        if(StrUtil.isEmpty(id)){
            // 符合条件（不存在id） 新增
            // 因为数据库设计的时候，id为字符串
            // 根据雪花算法来自动生成id
            String snowflakeIdStr = IdUtil.getSnowflakeNextIdStr();
            smartLabs.setId(snowflakeIdStr);
            smartLabsMapper.insert(smartLabs);
        }else{
            // 不符合条件（存在id） 更新
            smartLabsMapper.updateByPrimaryKeySelective(smartLabs);
        }
    }

    @Override
    public void removeLabsById(String id) {
        // 两种方法，选一个即可，另一个注释掉
        // 第一种方法：where id = ?
        smartLabsMapper.deleteByPrimaryKey(id);
        // 第二种方法：调用批量删除 where id in (?)
//        List<String> ids = Collections.singletonList(id);
//        removeLabsByIds(ids);
    }

    @Override
    public void removeLabsByIds(List<String> ids) {
        // 两种方法选一种即可，另一种记得注释
        // 方法一： 需要自己手动写 in 的动态sql -> 编写ex.mapper
        smartLabsExMapper.deleteBatch(ids);
        // 方法二： example - where id in (?,?,?)
//        SmartLabsExample example = new SmartLabsExample();
//        example.createCriteria().andIdIn(ids);
//        smartLabsMapper.deleteByExample(example);
    }

    @Override
    public PageInfo<SmartLabs> findLabsByPage(Integer pageNum, Integer pageSize, String key, String typeId) {
        // 1、开启分页
        PageHelper.startPage(pageNum,pageSize);
        // 2、将分页的集合传入pageInfo的构造器
        // 根据key来做模糊查询
        SmartLabsExample example = new SmartLabsExample();
        // 判断一下key是否存在，如果存在再进行模糊
        if(StrUtil.isNotEmpty(key)) {
            example.createCriteria().andLabsNameLike("%" + key + "%");
        }
        List<SmartLabs> smartLabs = smartLabsMapper.selectByExample(example);
        return new PageInfo<>(smartLabs);
    }
}
